/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */
package br.DAO;

import br.Modelo.Produto;

import java.util.ArrayList;
import java.util.List;

import javax.swing.JOptionPane;

import java.sql.Connection;
import java.sql.SQLException;
import java.sql.PreparedStatement;
import java.sql.Statement;
import java.sql.ResultSet;
/**
 *
 * @author ItaloLopes
 */
public class ProdutoDAO {
     
     public static void Salvar(Produto produto)
     {
         Connection conexao = FabricaConexao.GeraConexao();
         
         PreparedStatement insereSt = null;
         
         String sql = ("insert into produto(CODIGO_PROD, NOME_PROD, VALOR_PROD) "
                 + "values(?,?,?)");
         
         try
         {
             insereSt = conexao.prepareStatement(sql);
             //insereSt.setInt(1, usuario.getIdUsuario());
             insereSt.setInt(1, PegaProximoCodigo());
             insereSt.setString(2, produto.getNomeProduto());
             insereSt.setDouble(3, produto.getValor());
             insereSt.executeUpdate();
         }
         catch(SQLException e)
         {
             JOptionPane.showMessageDialog(null, "Erro ao incluir produto: " + e.getMessage());
         }
         finally
         {
             try
             {
                 insereSt.close();
                 conexao.close();
             }
             catch(Throwable e)
             {
                 JOptionPane.showMessageDialog(null, "Erro ao fechar conexão" + e.getMessage());
             }
         }
     }
     
     public static void Alterar(Produto produto)
     {
         Connection conexao = FabricaConexao.GeraConexao();
         
         PreparedStatement insereSt = null;
         
         String sql = ("UPDATE Produto SET CODIGO_PROD = ?, NOME_PROD = ?, VALOR_PROD = ? WHERE codigo_prod = ?");
         
         try
         {
             insereSt = conexao.prepareStatement(sql);
             //insereSt.setInt(1, PegaProximoCodigo());
             insereSt.setDouble(1, produto.getCodigoProduto());
             insereSt.setString(2, produto.getNomeProduto());
             insereSt.setDouble(3, produto.getValor());
             insereSt.setDouble(4, produto.getCodigoProduto());
             insereSt.executeUpdate();
         }
         catch(SQLException e)
         {
             System.out.println("Erro ao alterar produto: " + e.getMessage());
         }
         finally
         {
             try
             {
                 insereSt.close();
                 conexao.close();
             }
             catch(Throwable e)
             {
                 System.out.println("Erro ao fechar conexão: " + e.getMessage());
             }
         }
     }
     
     public static void Excluir(Produto produto)
     {
         Connection conexao = FabricaConexao.GeraConexao();
         
         PreparedStatement insereSt = null;
         
         String sql = ("DELETE FROM produto WHERE CODIGO_PROD = ?");
         
         try
         {
             insereSt = conexao.prepareStatement(sql);
             insereSt.setDouble(1, produto.getCodigoProduto());
             insereSt.executeUpdate();
         }
         catch(SQLException e)
         {
             System.out.println("Erro ao excluir produto: " + e.getMessage());
         }
         finally
         {
             try
             {
                 insereSt.close();
                 conexao.close();
             }
             catch(Throwable e)
             {
                 JOptionPane.showMessageDialog(null, "Erro ao fechar a conexão" + e.getMessage());
             }
         }
     }
     
     public static int PegaProximoCodigo()
     {
         Connection conexao = FabricaConexao.GeraConexao();
         
         Statement consulta = null;
         ResultSet resultado = null;
         int ProximoCodigo = 1;
         
         String sql = "SELECT MAX(codigo_prod) AS maior_codigo FROM Produto;";
         
         try
         {
             consulta = (Statement)conexao.createStatement();
             resultado = consulta.executeQuery(sql);
             
             resultado.next();
             ProximoCodigo = resultado.getInt("maior_codigo");
             ProximoCodigo++;
         }
         catch(SQLException e)
         {
             //JOptionPane.showMessageDialog(null, "Erro na execução da função PegaProximoCodigo" + e.getMessage());
         }
         finally
         {
             try
             {
                 consulta.close();
                 resultado.close();
                 conexao.close();
             }
             catch(Throwable e)
             {
                 //JOptionPane.showMessageDialog(null,"Erro ao fechar a conexão" + e.getMessage());
             }
             finally
             {
                 return ProximoCodigo;
             }
         }
     }
     
     public static Produto RecuperaObjetoId(Double ID)
     {
         Connection conexao = FabricaConexao.GeraConexao();
         
         Produto produtoRecuperado = new Produto();
         PreparedStatement consulta = null;
         ResultSet resultado = null;
         
         String sql = "SELECT * FROM Produto WHERE codigo_prod = ?";
         
         try
         {
             consulta = conexao.prepareStatement(sql);
             consulta.setDouble(1, ID);
             resultado = consulta.executeQuery();
             
             resultado.next();
             
             produtoRecuperado.setCodigoProduto(resultado.getDouble("codigo_prod"));
             produtoRecuperado.setNomeProduto(resultado.getString("nome_prod"));
             produtoRecuperado.setValor(resultado.getDouble("valor_prod"));
         }
         catch(SQLException e)
         {
             System.out.println("Erro ao recuperar produto" + e.getMessage());
         }
         finally
         {
             try
             {
                 consulta.close();
                 resultado.close();
                 conexao.close();
             }
             catch(Throwable e)
             {
                 System.out.println("Erro ao fechar conexão com o BD" + e.getMessage());
             }
             finally
             {
                 return produtoRecuperado;
             }
         }
     }
     
      
      public static List<Produto> ListarProdutos(String Nome)
      {
          Connection conexao = FabricaConexao.GeraConexao();
          
          List<Produto> produto = new ArrayList<Produto>();
          Statement consulta = null;
          ResultSet resultado = null;
          
          String sql = "SELECT * FROM produto ";
          sql = sql + "WHERE NOME_PROD like '%" + Nome + "%'";
          
          try
          {
              consulta = (Statement)conexao.createStatement();
              resultado = consulta.executeQuery(sql);
              
              while(resultado.next())
              {
                  Produto produtoTemp = new Produto();
                  produtoTemp.setCodigoProduto(resultado.getDouble("codigo_prod"));
                  produtoTemp.setNomeProduto(resultado.getString("nome_prod"));
                  produtoTemp.setValor(resultado.getDouble("valor_prod"));
                  
                  produto.add(produtoTemp);
              }
          }
          catch(SQLException e)
          {
              System.out.println("Erro ao recuperar usuarios: " + e.getMessage());
          }
          finally
          {
              try
              {
                  consulta.close();
                  resultado.close();
                  conexao.close();
              }
              catch(Throwable e)
              {
                  System.out.println("Erro ao fechar a conexão: " + e.getMessage());
              }
              finally
              {
                  return produto;
              }
          }
      }
      
      private static final int cnstNavPri = 0;
      private static final int cnstNavAnt = 1;
      private static final  int cnstNavProx = 2;
      private static final int cnstNavUlt = 3;
      
      public static String SQLNavegacao(int pOpcao, int pCodigoAtual)
      {
          String SQL = "";
          switch(pOpcao)
          {
              case cnstNavPri:
                  SQL = "SELECT MIN(codigo_prod) AS cod FROM produto";
                  break;
              case cnstNavAnt:
                  SQL = "SELECT MAX(codigo_prod) AS cod FROM produto WHERE codigo_prod < " + String.valueOf(pCodigoAtual);
                  break;
              case cnstNavProx:
                  SQL = "SELECT MIN(codigo_prod) AS cod FROM produto WHERE codigo_prod > " + String.valueOf(pCodigoAtual);
                  break;
              case cnstNavUlt:
                  SQL = "SELECT MAX(codigo_prod) AS cod FROM produto";
                  break;
          }
          return SQL;
      }
      
      public static int PegaCodigoPelaNavegacao(int pOpcao, int pCodigoAtual)
      {
          Connection conexao = FabricaConexao.GeraConexao();
          Statement consulta = null;
          ResultSet resultado = null;
          int CodigoEncontrado = -1;
          
          try{
              consulta = (Statement)conexao.createStatement();
              resultado = consulta.executeQuery(SQLNavegacao(pOpcao, pCodigoAtual));
              
              resultado.next();
              CodigoEncontrado = resultado.getInt("cod");
          }
          catch(Exception e){
              JOptionPane.showMessageDialog(null, "Erro ao executar sql de navegação: " + e.getMessage());
          }
          finally{
              try{
                  consulta.close();
                  conexao.close();
              }
              catch(Throwable e){
                  JOptionPane.showMessageDialog(null, "Erro ao fechar conexão com o BD: " + e.getMessage());
              }
          }
          
          return CodigoEncontrado;
      }
      
      public static ArrayList<Produto> PesquisaObjeto(String sCampo, String sValor, boolean bTodaParte){
          String sql = "SELECT * FROM Produto WHERE " +  sCampo;
          if(bTodaParte){
              sql = sql + " like '%";
            sql = sql + sValor + "%'";
          }
          else
          {
              sql = sql + " = '" + sValor + "'";
          }
          System.out.println(sql);
          
          return RecuperaObjetos(sql);
      }
      
      private static ArrayList<Produto> RecuperaObjetos(String sql){
          Connection conexao = FabricaConexao.GeraConexao();
          Produto prod;
          
          ArrayList<Produto> produto = new ArrayList<Produto>();
          Statement consulta = null;
          ResultSet resultado = null;
          
          try
          {
              consulta = (Statement)conexao.createStatement();
              resultado = consulta.executeQuery(sql);
              
              while(resultado.next())
              {
                  Produto ProdutoTemp = new Produto();
                  ProdutoTemp.setCodigoProduto(resultado.getDouble("codigo_prod"));
                  ProdutoTemp.setNomeProduto(resultado.getString("nome_prod"));
                  ProdutoTemp.setValor(resultado.getDouble("Valor_prod"));
                  produto.add(ProdutoTemp);
              }
          }
          catch(SQLException e)
          {
              System.out.println("Erro ao recuperar usuarios: " + e.getMessage());
          }
          finally
          {
              try
              {
                  consulta.close();
                  resultado.close();
                  conexao.close();
              }
              catch(Throwable e)
              {
                  System.out.println("Erro ao fechar a conexão: " + e.getMessage());
              }
              finally
              {
                  return produto;
              }
          }
      }
}
